#!/bin/bash

# Android 模拟器启动脚本
# 用于快速启动 Android 模拟器进行 UniApp 应用测试

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查命令是否存在
check_command() {
    if ! command -v $1 &> /dev/null; then
        print_error "$1 命令未找到，请确保已安装 Android SDK 并配置环境变量"
        echo "请在 ~/.zshrc 或 ~/.bash_profile 中添加："
        echo "export ANDROID_HOME=\$HOME/Library/Android/sdk"
        echo "export PATH=\$PATH:\$ANDROID_HOME/emulator:\$ANDROID_HOME/platform-tools"
        exit 1
    fi
}

# 检查模拟器是否已经在运行
check_emulator_running() {
    running_devices=$(adb devices | grep "emulator-" | grep "device$" | wc -l)
    if [ $running_devices -gt 0 ]; then
        return 0
    else
        return 1
    fi
}

# 列出所有可用的 AVD
list_avds() {
    print_info "可用的 Android 虚拟设备："
    emulator -list-avds
}

# 启动模拟器
start_emulator() {
    local avd_name=$1
    
    print_info "正在启动模拟器: $avd_name"
    print_info "模拟器启动可能需要 30-60 秒，请耐心等待..."
    
    # 在后台启动模拟器，禁用音频以避免警告
    nohup emulator -avd "$avd_name" -no-audio > /tmp/emulator.log 2>&1 &
    
    # 等待模拟器启动
    print_info "等待模拟器启动..."
    local max_wait=60
    local wait_time=0
    
    while [ $wait_time -lt $max_wait ]; do
        if check_emulator_running; then
            print_success "模拟器启动成功！"
            return 0
        fi
        sleep 2
        wait_time=$((wait_time + 2))
        echo -n "."
    done
    
    echo ""
    print_error "模拟器启动超时"
    return 1
}

# 等待模拟器完全启动（系统就绪）
wait_for_boot_complete() {
    print_info "等待模拟器系统完全启动..."
    local max_wait=120
    local wait_time=0
    
    while [ $wait_time -lt $max_wait ]; do
        boot_completed=$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')
        if [ "$boot_completed" = "1" ]; then
            print_success "模拟器系统启动完成！"
            return 0
        fi
        sleep 3
        wait_time=$((wait_time + 3))
        echo -n "."
    done
    
    echo ""
    print_warning "等待系统启动超时，但模拟器可能仍在启动中"
    return 1
}

# 显示模拟器信息
show_emulator_info() {
    print_info "已连接的设备："
    adb devices -l
    echo ""
    
    # 获取设备信息
    if check_emulator_running; then
        print_info "设备详细信息："
        echo "- Android 版本: $(adb shell getprop ro.build.version.release)"
        echo "- API 级别: $(adb shell getprop ro.build.version.sdk)"
        echo "- 设备型号: $(adb shell getprop ro.product.model)"
        echo "- 屏幕分辨率: $(adb shell wm size | cut -d' ' -f3)"
        echo "- 屏幕密度: $(adb shell wm density | cut -d' ' -f3)"
    fi
}

# 主函数
main() {
    echo "=================================="
    echo "  Android 模拟器启动脚本"
    echo "=================================="
    echo ""
    
    # 检查必要的命令
    check_command "emulator"
    check_command "adb"
    
    # 检查是否已有模拟器在运行
    if check_emulator_running; then
        print_warning "检测到模拟器已在运行"
        show_emulator_info
        echo ""
        read -p "是否要启动新的模拟器？(y/N): " answer
        if [[ ! $answer =~ ^[Yy]$ ]]; then
            print_info "使用现有模拟器"
            exit 0
        fi
    fi
    
    # 列出可用的 AVD
    list_avds
    echo ""
    
    # 获取 AVD 列表
    avds=($(emulator -list-avds))
    
    if [ ${#avds[@]} -eq 0 ]; then
        print_error "未找到可用的 Android 虚拟设备"
        print_info "请先在 Android Studio 中创建 AVD"
        exit 1
    fi
    
    # 如果只有一个 AVD，直接使用它
    if [ ${#avds[@]} -eq 1 ]; then
        avd_name=${avds[0]}
        print_info "使用默认 AVD: $avd_name"
    else
        # 让用户选择 AVD
        print_info "请选择要启动的模拟器:"
        select avd_name in "${avds[@]}"; do
            if [ -n "$avd_name" ]; then
                break
            fi
        done
    fi
    
    # 启动模拟器
    if start_emulator "$avd_name"; then
        wait_for_boot_complete
        echo ""
        show_emulator_info
        echo ""
        print_success "模拟器已就绪，可以开始开发了！"
        echo ""
        print_info "提示："
        echo "- 安装 APK: adb install app.apk"
        echo "- 查看日志: adb logcat"
        echo "- 查看设备: adb devices"
        echo "- 关闭模拟器: adb emu kill"
    else
        print_error "模拟器启动失败，请查看日志: /tmp/emulator.log"
        exit 1
    fi
}

# 运行主函数
main


